package com.firewolf.entities.one2n;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MainDriver {
	
	private EntityManagerFactory factory = null;
	private EntityManager manager = null;
	private EntityTransaction tx = null;
	
	@Before
	public void init(){
		factory = Persistence.createEntityManagerFactory("jpa");
		manager = factory.createEntityManager();
		tx = manager.getTransaction();
		tx.begin();
	}
	
	@After
	public void destory(){
		tx.commit();
		manager.close();
		factory.close();
	}
	
	/**
	 * 生成表
	 */
	@Test
	public void generateTable(){
	}
	
	/**
	 * 增加，
	 * 会生成insert语句和update语句，因为是由1的一端维护关联关系，
	 * 在插入多的一端的时候，没有外键的值
	 * 
	 * 如果只保存一的一端就能同时保存多的一端，可以给@OneToMany设置cascade={CascadeType.PERSIST}
	 */
	@Test
	public void persist(){
		Student s1 = new Student();
		s1.setName("liuxing");
		s1.setPwd("123");
		Student s2 = new Student();
		s2.setName("wangwu");
		s2.setPwd("1234");
		
		Clazz c = new Clazz();
		c.setName("1701A");
		Set<Student> ss = new HashSet<>();
		ss.add(s1);
		ss.add(s2);
		
		c.setStus(ss);
		
		manager.persist(s1);
		manager.persist(s2);
		manager.persist(c);
		
	}
	
	/**
	 * 可以查出级联属性，
	 * 这里会发送两条SQL语句，因为默认是懒加载，可以通过摄者fetch=FetchType.EAGER来改成立即加载
	 */
	@Test
	public void find(){
		System.out.println(manager.find(Clazz.class, 1).getStus().iterator().next().getName());
	}
	
	/**
	 * 删除的时候，默认会先把关联的外键值改为null，然后删除1的一端
	 * 如果需要级联删除，设置cascade=CascadeType.REMOVE
	 */
	@Test
	public void delete(){
		Clazz clazz = manager.find(Clazz.class, 3);
		manager.remove(clazz);
	}
}
